﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace QuanLyNhaSach.BusinessLogicLayer
{
    class QuanLyBaoCaoBLL
    {
        public QuanLyBaoCaoBLL()
        {

        }

        #region BAOCAOTON
        PhieuNhapBLL phieuNhap;
        DataTable dsNhap;
        QuanLySachBLL quanLySach;
        QuanLyBanHangBLL quanLyBanHang = new QuanLyBanHangBLL();
        DataTable dsBan;
        string[] dsMaSach;
        int[] soLuongNhapMotLoaiSach;
        int[] soLuongBanMotLoaiSach;
        int[] soLuongSachPhatSinh;
        int[] soLuongSachTonCuoi;
        int[] soLuongSachTonDau;
        string maPhieuTon;

        DataAccessLayer.TonKhoDAO tonKho = new DataAccessLayer.TonKhoDAO();

        public int TinhTonKho(string thangBC)
        {
            if (!KiemTraTonKho(thangBC))
            {
                //lấy các phiếu nhập theo tháng
                phieuNhap = new PhieuNhapBLL();
                dsNhap = phieuNhap.LayTheoThang(thangBC);

                //lấy tất cả hóa đơn theo tháng                
                dsBan = quanLyBanHang.LayHoaDonTheoThang(thangBC);

                //lấy danh sách mã sách có trong kho
                quanLySach = new QuanLySachBLL();
                dsMaSach = LayDSMaSach(quanLySach.LayDanhSach());

                //tính lượng sách nhập vào của từng đầu sách.
                soLuongNhapMotLoaiSach = new int[dsMaSach.Length];
                int i = 0;
                foreach (string ms in dsMaSach)
                {
                    soLuongNhapMotLoaiSach[i++] = LaySoLuongSachNhap(ms);
                }

                //tính lượng sách bán được theo từng đầu sách
                i = 0;
                soLuongBanMotLoaiSach = new int[dsMaSach.Length];
                foreach (string ms in dsMaSach)
                {
                    soLuongBanMotLoaiSach[i++] = LaySoLuongSachBan(ms);
                }

                //tính lượng sách phát sinh theo tháng
                soLuongSachPhatSinh = new int[dsMaSach.Length];
                soLuongSachTonDau = new int[dsMaSach.Length];
                for (int j = 0; j < dsMaSach.Length; j++)
                {
                    soLuongSachPhatSinh[j] = soLuongNhapMotLoaiSach[j] - soLuongBanMotLoaiSach[j];
                    soLuongSachTonDau[j] = soLuongSachTonCuoi[j] - soLuongSachPhatSinh[j];
                }
                LuuTonKho(thangBC);
            }
            else
            {
                DataTable dt = tonKho.LayBaoCaoTon(thangBC);
                int i = 0;
                dsMaSach = new string[dt.Rows.Count];
                soLuongSachTonDau = new int[dt.Rows.Count];
                soLuongSachPhatSinh = new int[dt.Rows.Count];
                soLuongSachTonCuoi = new int[dt.Rows.Count];
                foreach (DataRow dr in dt.Rows)
                {
                    dsMaSach[i] = dr.Field<string>("MaSach");
                    soLuongSachTonDau[i] = dr.Field<int>("TonDau");
                    soLuongSachPhatSinh[i] = dr.Field<int>("PhatSinh");
                    soLuongSachTonCuoi[i++] = dr.Field<int>("TonCuoi");
                }
            }
            return dsMaSach.Length;
        }

        public object[] TaiTonKho(int index)
        {
            object[] row = { index, dsMaSach[index], soLuongSachTonDau[index], soLuongSachPhatSinh[index], soLuongSachTonCuoi[index] };
            return row;
        }

        private int LaySoLuongSachBan(string maSach)
        {
            int x = 0;
            foreach (DataRow dr in dsBan.Rows)
            {
                if (dr.Field<string>("MaSach") == maSach)
                    x += dr.Field<int>("SoLuong");
            }
            return x;
        }

        //lấy số lượng sách của maSach theo phiếu nhập trong tháng.
        private int LaySoLuongSachNhap(string maSach)
        {
            int x = 0;
            foreach (DataRow dr in dsNhap.Rows)
            {
                if (dr.Field<string>("MaSach") == maSach)
                    x += dr.Field<int>("SoLuong");
            }
            return x;
        }

        //lấy ds các maSach có trong kho
        private string[] LayDSMaSach(DataTable db)
        {
            int i = 0;
            string[] tmp = new string[db.Rows.Count];
            soLuongSachTonCuoi = new int[db.Rows.Count];
            foreach (DataRow dr in db.Rows)
            {
                tmp[i] = dr.Field<string>("MaSach");
                soLuongSachTonCuoi[i++] = dr.Field<int>("SoLuong");
            }
            return tmp;
        }

        private bool KiemTraTonKho(string dateTime)
        {
            //kiểm tra dữ liệu đã được lưu chưa
            DataTable dt = tonKho.LayDanhSach();

            int iMa = 0;
            DateTime d;
            string s;
            foreach (DataRow dr in dt.Rows)
            {
                d = dr.Field<DateTime>("NgayLap");
                s = d.ToString("M/dd/yyyy");
                if (s == dateTime)
                    return true;
                iMa += 1;
            }
            maPhieuTon = "PT" + iMa.ToString();
            return false;
        }

        private void LuuTonKho(string dateTime)
        {
            tonKho.ThemPhieuTon(maPhieuTon, dateTime);
            for (int i = 0; i < dsMaSach.Length; i++)
            {
                tonKho.ThemCTT(maPhieuTon, dsMaSach[i],
                    soLuongSachTonDau[i], soLuongSachPhatSinh[i], soLuongSachTonCuoi[i]);
            }
        }

        #endregion

        #region BAOCAOCONGNO

        string[] dsKhachHangNo;
        int[] soTienNoDau;
        int[] soTienNoPhatSinh;
        int[] soTienNoCuoi;
        string[] dsMaHoaDonNo;
        DataTable dsHoaDonNo;
        DataTable dsPhieuThu;
        DataAccessLayer.CongNoDAO congNo = new DataAccessLayer.CongNoDAO();
        string maCongNo;

        public int TinhCongNo(string thangBC)
        {
            if(!KiemTraCongNo(thangBC))
            {
                LayDanhSachKhachHangNo(thangBC);
                TinhNoPhatSinh(thangBC);
                for (int i = 0; i < dsKhachHangNo.Length; i++)
                {
                    soTienNoCuoi[i] = soTienNoDau[i] - soTienNoPhatSinh[i];
                }
                if(dsKhachHangNo.Length != 0)
                    LuuCongNo(thangBC);
            }
            else
            {
                DataTable dt = congNo.LayBaoCaoCongNo(thangBC);
                int i = 0;
                dsKhachHangNo = new string[dt.Rows.Count];
                soTienNoCuoi = new int[dt.Rows.Count];
                soTienNoDau = new int[dt.Rows.Count];
                soTienNoPhatSinh = new int[dt.Rows.Count];
                foreach (DataRow dr in dt.Rows)
                {
                    dsKhachHangNo[i] = dr.Field<string>("MaKH");
                    soTienNoDau[i] = dr.Field<int>("NoDau");
                    soTienNoPhatSinh[i] = dr.Field<int>("PhatSinh");
                    soTienNoCuoi[i++] = dr.Field<int>("NoCuoi");
                }
            }
            return dsKhachHangNo.Length;
        }

        public object[] TaiCongNo(int index)
        {
            object[] row = {index, dsKhachHangNo[index], soTienNoDau[index], soTienNoPhatSinh[index], soTienNoCuoi[index]};
            return row;
        }

        private void LayDanhSachKhachHangNo(string thangBC)
        {
            dsHoaDonNo = new DataTable();
            dsHoaDonNo = quanLyBanHang.LayHoaDonNoTheoThang(thangBC);
            int i = 0;
            dsMaHoaDonNo = new string[dsHoaDonNo.Rows.Count];
            soTienNoDau = new int[dsHoaDonNo.Rows.Count];
            dsKhachHangNo = new string[dsHoaDonNo.Rows.Count];
            foreach (DataRow dr in dsHoaDonNo.Rows)
            {
                dsKhachHangNo[i] = dr.Field<string>("MaKH");
                soTienNoDau[i] = dr.Field<int>("SoLuong") * dr.Field<int>("DonGia");
                dsMaHoaDonNo[i++] = dr.Field<string>("MaHoaDon");
            }
        }

        private void TinhNoPhatSinh(string thangBC)
        {
            dsPhieuThu = new DataTable();
            dsPhieuThu = quanLyBanHang.LayPhieuThuTheoThang(thangBC);
            string maHD;
            soTienNoPhatSinh = new int[dsPhieuThu.Rows.Count];
            foreach (DataRow dr in dsPhieuThu.Rows)
            {
                maHD = dr.Field<string>("MaHoaDon");
                for (int i = 0; i < dsPhieuThu.Rows.Count; i++)
                {
                    if (maHD == dsMaHoaDonNo[i])
                        soTienNoPhatSinh[i] += dr.Field<int>("SoTienThu");
                }
            }
        }

        private bool KiemTraCongNo(string dateTime)
        {
            //kiểm tra dữ liệu đã được lưu chưa
            DataTable dt = congNo.LayDanhSach();

            int iMa = 0;
            DateTime d;
            string s;
            foreach (DataRow dr in dt.Rows)
            {
                d = dr.Field<DateTime>("NgayLap");
                s = d.ToString("M/dd/yyyy");
                if (s == dateTime)
                    return true;
                iMa += 1;
            }
            maCongNo = "CN" + iMa.ToString();
            return false;
        }

        private void LuuCongNo(string dateTime)
        {
            congNo.ThemPhieuCongNo(maCongNo, dateTime);
            for (int i = 0; i < dsKhachHangNo.Length; i++)
            {
                congNo.ThemCTNO(maCongNo, dsKhachHangNo[i],
                    soTienNoDau[i], soTienNoPhatSinh[i], soTienNoCuoi[i]);
            }
        }

        #endregion
    }
}
